package com.shisfish.library.Utils;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

@SuppressWarnings("restriction")
public class EncryptUtils {
	
	public static String myEncry(String str1, String str2) {
		
		String str11 = commonsCodesMD5(str1);
		String str22 = commonsCodesSHA1(str2);
		
		return str11 + str22;
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:54:46
	 * @Description jdk Base64 加密
	 * @param str
	 * @return
	 */
	public static String jdkBase64Encoder(String str) {
		
		BASE64Encoder encoder = new BASE64Encoder();
		String encode = encoder.encode(str.getBytes());
		
		return encode;
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:55:20
	 * @Description jdk Base64 解密
	 * @param str
	 * @return
	 */
	public static String jdkBase64Decoder(String str) {
		
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] decode = null;
		try {
			decode = decoder.decodeBuffer(str);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return new String(decode);
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:55:35
	 * @Description CommonsCodes Base64 加密
	 * @param str
	 * @return
	 */
	public static String commonsCodesBase64Encoder(String str) {
		
		byte[] encoderBytes = Base64.encodeBase64(str.getBytes());
		
		return new String(encoderBytes);
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:55:56
	 * @Description CommonsCodes Base64 解密
	 * @param str
	 * @return
	 */
	public static String commonsCodesBase64Decoder(String str) {
		
		byte[] decoderBytes = Base64.decodeBase64(str);
		
		return new String(decoderBytes);
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:56:09
	 * @Description jdk MD5 加密
	 * @param str
	 * @return
	 */
	public static String jdkMD5(String str) {
		
		MessageDigest md = null;
		String md5Str = null;
		try {
			md = MessageDigest.getInstance("MD5");
			byte[] md5Bytes = md.digest(str.getBytes());
			md5Str = org.apache.commons.codec.binary.Hex.encodeHexString(md5Bytes);
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return md5Str;
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:56:25
	 * @Description CommonsCodes MD5 加密
	 * @param str
	 * @return
	 */
	public static String commonsCodesMD5(String str) {
		
		String md5 = DigestUtils.md5Hex(str.getBytes());
		
		return md5;
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:56:38
	 * @Description jdk SHA1 加密
	 * @param str
	 * @return
	 */
	public static String jdkSHA1(String str) {
		
		MessageDigest md = null;
		String shaStr = null;
		try {
			md = MessageDigest.getInstance("SHA");
			md.update(str.getBytes());
			shaStr = org.apache.commons.codec.binary.Hex.encodeHexString(md.digest());
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return shaStr;
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:56:48
	 * @Description CommonsCodes SHA1 加密
	 * @param str
	 * @return
	 */
	public static String commonsCodesSHA1(String str) {
		
		String sha1 = DigestUtils.sha1Hex(str.getBytes());
		
		return sha1;
	}
	
	/**
	 * @author shisfish
	 * @date 2016年1月20日 下午5:57:07
	 * @Description jdk HmacMD5 加密
	 * @param str
	 * @return
	 */
	public static String jdkHmacMD5(String str) {
		
		String hmacMD5Str = null;
		try {
			//KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); // 初始化KeyGenerator
			//SecretKey secretKey = keyGenerator.generateKey(); // 产生密钥
			//byte[] key = secretKey.getEncoded(); // 获得密钥
			byte[] key = Hex.decodeHex(new char[] {'1', '2', '3', '4'});
			System.out.println(key);
			
			SecretKey restoreKey = new SecretKeySpec(key, "HmacMD5"); // 还原密钥
			Mac mac = Mac.getInstance(restoreKey.getAlgorithm()); // 实例化MAC
			mac.init(restoreKey); // 初始化MAC
			byte[] hmacMD5Bytes = mac.doFinal(str.getBytes()); // 执行摘要
			hmacMD5Str = Hex.encodeHexString(hmacMD5Bytes);
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (DecoderException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return hmacMD5Str;
	}
	
	/**
	 * @author shisfish
	 * @date 2015年12月18日 下午2:44:49
	 * @Description SHA加密
	 * @param password
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String getSHA(String password) throws NoSuchAlgorithmException {
		
		MessageDigest md = MessageDigest.getInstance("SHA");// SHA 或者 MD5
		BASE64Encoder base = new BASE64Encoder();
		String pass = base.encode(md.digest(password.getBytes()));
		
		return pass;
	}
	
	/**
	 * @author shisfish
	 * @date 2015年12月18日 下午2:46:54
	 * @Description MD5加密
	 * @param passwrod
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String getMD5(String password) throws NoSuchAlgorithmException {
		
		MessageDigest md = MessageDigest.getInstance("MD5");// SHA 或者 MD5
		BASE64Encoder base = new BASE64Encoder();
		String pass = base.encode(md.digest(password.getBytes()));
		
		return pass;
	}
	
	/*** 
     * MD5加码 生成32位md5码 
     */ 
    public static String string2MD5(String inStr){  
        MessageDigest md5 = null;  
        try{  
            md5 = MessageDigest.getInstance("MD5");  
        }catch (Exception e){  
            System.out.println(e.toString());  
            e.printStackTrace();  
            return "";  
        }  
        char[] charArray = inStr.toCharArray();  
        byte[] byteArray = new byte[charArray.length];  
  
        for (int i = 0; i < charArray.length; i++)  
            byteArray[i] = (byte) charArray[i];  
        byte[] md5Bytes = md5.digest(byteArray);  
        StringBuffer hexValue = new StringBuffer();  
        for (int i = 0; i < md5Bytes.length; i++){  
            int val = ((int) md5Bytes[i]) & 0xff;  
            if (val < 16)  
                hexValue.append("0");  
            hexValue.append(Integer.toHexString(val));  
        }  
        return hexValue.toString();  
  
    }  
  
    /** 
     * 加密解密算法 执行一次加密，两次解密 
     */   
    public static String convertMD5(String inStr){  
  
        char[] a = inStr.toCharArray();  
        for (int i = 0; i < a.length; i++){  
            a[i] = (char) (a[i] ^ 't');  
        }  
        String s = new String(a);  
        return s;  
  
    }
	
    public static String STR = "123456";
    
	public static void main(String[] args) throws NoSuchAlgorithmException {
		System.out.println(jdkBase64Encoder(STR));
		
		String str1 = jdkBase64Encoder(STR);
		
		System.out.println(jdkBase64Decoder(str1));
		
		System.out.println(commonsCodesBase64Encoder(STR));
		
		String str2 = commonsCodesBase64Encoder(STR);
		
		System.out.println(commonsCodesBase64Decoder(str2));
		
		System.out.println(jdkMD5(STR));
		
		System.out.println(commonsCodesMD5(STR));
		
		System.out.println(jdkSHA1(STR));
		
		System.out.println(commonsCodesSHA1(STR));
		
		System.out.println(jdkHmacMD5(STR));
		
		System.out.println(getMD5(STR + "lVkjjOMMDN10WYmWerip"));
	}
	
}
